home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / src / loaders / jst / jst_cus.asm next >
Assembly Source File  |  2000-04-12  |  6KB  |  344 lines

  1.  
  2. adkcon_off = $6
  3. dmacon_off = $4
  4. intena_off = $2
  5. intreq_off = $0
  6.  
  7. ; *** Save readable custom registers
  8. ; *** in the custom regs system buffer
  9.  
  10. RelFun_SaveCustomRegs:
  11.     move.l    A1,-(sp)
  12.     lea    Var_customregs(PC),A1
  13.     bsr    GetCustomRegs
  14.     move.l    (sp)+,A1
  15.     rts
  16.  
  17. ; *** Store custom registers in the given buffer
  18. ; in: A1: buffer
  19.  
  20. GetCustomRegs:
  21.     STORE_REGS
  22.     lea    $DFF000,A5
  23.     move.l    A1,A4
  24.     MOVE.W    intreqr(A5),(intreq_off,A4)    ; and intreq of the running game
  25.     ORI.W    #$8000,(intreq_off,A4)
  26.     MOVE.W    intenar(A5),(intena_off,A4)    ; saves the old values of intena
  27.     ORI.W    #$8000,(intena_off,A4)
  28.     MOVE.W    dmaconr(A5),(dmacon_off,A4)    ; and dmacon too
  29.     ORI.W    #$8000,(dmacon_off,A4)
  30.     MOVE.W    adkconr(A5),(adkcon_off,A4)    ; and akdcon too
  31.     ORI.W    #$8000,(adkcon_off,A4)
  32.     RESTORE_REGS
  33.     rts
  34.  
  35.  
  36. ; *** Sets custom registers from given buffer
  37. ; in: A1: buffer
  38.  
  39. SetCustomRegs:
  40.     STORE_REGS
  41.     
  42.     ; remove old values
  43.  
  44.     bsr    RelFun_FreezeAll
  45.  
  46.     ; set new values
  47.  
  48.     lea    $DFF000,A5        
  49.     move.l    A1,A4
  50.     MOVE.W    (intreq_off,A4),intreq(A5)
  51.     MOVE.W    (intena_off,A4),intena(A5)
  52.     MOVE.W    (dmacon_off,A4),dmacon(A5)
  53.     MOVE.W    (adkcon_off,A4),adkcon(A5)
  54.     RESTORE_REGS
  55.     rts
  56.  
  57. ; *** Restore previously saved custom registers
  58.  
  59. RelFun_RestoreCustomRegs:
  60.     move.l    A1,-(sp)
  61.     lea    Var_customregs(PC),A1
  62.     bsr    SetCustomRegs
  63.     move.l    (sp)+,A1
  64.     rts
  65.  
  66. ; *** Restore previously saved custom registers, but without DMA
  67. ; *** to avoid graphics corruption (on Shadow Fighter, for instance)
  68.  
  69. RelFun_RestoreCustomNoDMA:
  70.     movem.l    D0/A1/A2,-(sp)
  71.     lea    Var_customregs(PC),A1
  72.     lea    Var_nodispregs(PC),A2
  73.     move.w    (A1)+,(A2)+    ; copy intreq
  74.     move.w    (A1)+,(A2)+    ; copy intena
  75.     move.w    (A1)+,D0    ; dmacon
  76. ;    and.w    #$FC70,D0    ; all but bitplane, copper and sound things :-)
  77.     moveq.l    #0,D0        ; finally, no DMA at all
  78.     move.w    D0,(A2)+
  79.     move.w    (A1)+,(A2)+    ; copy adkcon
  80.     
  81.     lea    Var_nodispregs(PC),A1
  82.     bsr    SetCustomRegs
  83.     movem.l    (sp)+,D0/A1/A2
  84.     rts
  85.  
  86. ; *** CIA-A/B code (store/restore)
  87.  
  88. ; *** timer storage offsets
  89.  
  90. TimerAA = $0
  91. TimerAB = $5
  92. TimerBA = $A
  93. TimerBB = $F
  94.  
  95. CR = 0
  96. THI = 1
  97. TLO = 2
  98. LHI = 3
  99. LLO = 4
  100.  
  101.  
  102. ; *** Save CIA registers in a buffer
  103. ; in: A1: buffer
  104.  
  105. GetCiaRegs:
  106.     STORE_REGS
  107.     LEA    $BFE001,A2
  108.     lea    $BFD000,a4
  109.  
  110.     move.l    A1,A5        ; buffer for timers, base
  111.  
  112.     lea    $1E01(a4),a0
  113.     lea    $1401(a4),a1
  114.     lea    $1501(a4),a2
  115.     lea    TimerAA(A5),A3    ; offset
  116.     bsr    GetTimer
  117.  
  118.     lea    $1F01(a4),a0
  119.     lea    $1601(a4),a1
  120.     lea     $1701(a4),a2
  121.     lea    TimerAB(A5),A3    ; offset
  122.     bsr    GetTimer
  123.  
  124.     lea    $E00(a4),a0
  125.     lea    $400(a4),a1
  126.     lea    $500(a4),a2
  127.     lea    TimerBA(A5),A3    ; offset
  128.     bsr    GetTimer
  129.  
  130.     lea    $F00(a4),a0
  131.     lea    $600(a4),a1
  132.     lea    $700(a4),a2
  133.     lea    TimerBB(A5),A3    ; offset
  134.     bsr    GetTimer
  135.  
  136.     clr.b    $1E01(a4)
  137.     clr.b    $1F01(a4)
  138.     clr.b    $E00(a4)
  139.     clr.b    $F00(a4)
  140.  
  141.     RESTORE_REGS
  142.     rts
  143.  
  144. ; *** Restore CIA regs from a buffer
  145. ; in: A1: buffer
  146.  
  147. SetCiaRegs:
  148.     STORE_REGS
  149.     lea     $BFD000,a4
  150.     move.l    A1,A5        ; timer base
  151.  
  152.     lea     $1E01(a4),a0
  153.     lea     $1401(a4),a1
  154.     lea     $1501(a4),a2
  155.     lea     TimerAA(A5),a3
  156.     bsr    SetTimer
  157.  
  158.     lea     $1F01(a4),a0
  159.     lea     $1601(a4),a1
  160.     lea     $1701(a4),a2
  161.     lea     TimerAB(A5),a3
  162.     bsr   SetTimer
  163.  
  164.     lea     $E00(a4),a0
  165.     lea     $400(a4),a1
  166.     lea     $500(a4),a2
  167.     lea    TimerBA(A5),a3
  168.     bsr   SetTimer
  169.  
  170.     lea     $F00(a4),a0
  171.     lea     $600(a4),a1
  172.     lea     $700(a4),a2
  173.     lea    TimerBB(A5),a3
  174.     bsr   SetTimer
  175.     RESTORE_REGS
  176.     rts
  177.  
  178.  
  179. ; *** get timer values
  180. ; *** thanks to Alain Malek for the source code
  181.  
  182. GetTimer:
  183.     move.b  (a0),CR(a3)             ;store state of control register
  184.     bclr    #0,(a0)                 ;stop the timer
  185.     nop
  186.     move.b  (a1),TLO(a3)            ;store the actual timer values
  187.     move.b  (a2),THI(a3)
  188.     bclr    #3,(a0)                 ;set continuous mode
  189.     nop
  190.     bclr    #1,(a0)                 ;clear PB operation mode
  191.     nop
  192.     bset    #4,(a0)                 ;force load latch->timer
  193.     nop
  194.     move.b  (a1),LLO(a3)            ;store latch values
  195.     move.b  (a2),LHI(a3)
  196.  
  197.     bsr    SetTimer
  198.  
  199.     rts
  200.  
  201. ; *** set timer values
  202. ; *** thanks to Alain Malek for the source code
  203.  
  204. SetTimer:
  205.     clr.b   CR(a0)                  ;clear all CR values
  206.     nop
  207.     move.b  TLO(a3),(a1)            ;set latch to original timer value
  208.     move.b  THI(a3),(a2)
  209.     nop
  210.     bset    #4,(a0)                 ;move latch->timer
  211.     nop
  212.     move.b  LLO(a3),(a1)            ;set latch to original latch value
  213.     move.b  LHI(a3),(a2)
  214.     nop
  215.     move.b  CR(a3),(a0)             ;restore the timer's work
  216.     rts
  217.  
  218.  
  219. ; *** Save CIA registers
  220.  
  221. RelFun_SaveCIARegs
  222.     movem.l    D0/A1,-(sp)
  223.     lea    Var_ciaregs(pc),A1
  224.     bsr    GetCiaRegs
  225.     bsr    GetLed
  226.     movem.l    (sp)+,D0/A1
  227.     rts
  228.  
  229.  
  230. GetLed:
  231.     movem.l    D0/A1,-(sp)
  232.     lea    Var_led(pc),A1
  233.     move.b    $BFE001,D0    ; CIAPRA
  234.     lsr.b    #1,D0
  235.     and.b    #1,D0
  236.     move.w    D0,(A1)        ; store LED value
  237.  
  238.     movem.l    (sp)+,D0/A1
  239.     rts
  240.  
  241. ; *** Restore CIA registers
  242.  
  243. RelFun_RestoreCIARegs
  244.     movem.l    D0/A1,-(sp)
  245.     lea    Var_ciaregs(pc),A1
  246.     bsr    SetCiaRegs
  247.     bsr    ResetCIAs
  248.     movem.l    (sp)+,A1/D0
  249.     rts
  250.  
  251. SetLed:
  252.     movem.l    D0/A1,-(sp)
  253.  
  254.     ; ** reset LED/Filter
  255.     
  256.     move.w    Var_led(pc),D0
  257.     bne    1$
  258.     bclr.b    #1,$BFE001
  259.     bra    2$
  260. 1$
  261.     bset.b    #1,$BFE001
  262. 2$
  263.     movem.l    (sp)+,A1/D0
  264.     rts
  265.  
  266.  
  267. ; *** Reset the CIAs for the keyboard
  268. ; *** Thanks to Alain Malek for this piece of code
  269.  
  270.     RESET_CIA_CODE
  271.  
  272.  
  273. ; *** Freeze DMA and interrupts
  274.  
  275. ; be sure to save the custom registers before
  276. ; with _SaveCustomRegs
  277.  
  278. RelFun_FreezeAll:
  279.     MOVE.W    #$7FFF,intena+$DFF000
  280.     MOVE.W    #$7FFF,dmacon+$DFF000
  281.     MOVE.W    #$7FFF,intreq+$DFF000
  282.     MOVE.W    #$7FFF,adkcon+$DFF000
  283.     rts
  284.  
  285. start_snapshot:
  286.     dc.l    0    ; snapshot sysdata version here
  287. reserved_snapshot:
  288.     dc.l    0    ; snapshot reserved for future use
  289.  
  290. datastream:
  291.  
  292. ; do not change anything below (format for RawDoFmt)
  293.  
  294. Var_pc:
  295.     dc.l    0
  296. Var_offset:
  297.     dc.l    0
  298. Var_reloc_extbuf:
  299.     dc.l    0    ; copy of reloc_extbuf
  300. Var_reloc_24bitbuf:
  301.     dc.l    0    ; copy of reloc_24bit buf
  302. Var_sr:
  303.     dc.w    0
  304. Var_gamecustomregs:
  305. Var_intreq:
  306.     dc.w    0    ; intreq
  307. Var_intena:
  308.     dc.w    0    ; intena
  309. Var_dmacon:
  310.     dc.w    0    ; dmacon
  311. Var_adkcon:
  312.     dc.w    0    ; adkcon
  313.  
  314. Var_gameciaregs:
  315.     blk.l    6,0
  316.  
  317. Var_customregs:
  318.     dc.w    0    ; intreq
  319.     dc.w    0    ; intena
  320.     dc.w    0    ; dmacon
  321.     dc.w    0    ; adkcon
  322.  
  323.     ; now the following order has got no importance for RawDoFmt
  324.     ; BUT will change version of the snapshot file!
  325.  
  326. Var_ciaregs:
  327.     blk.l    6,0
  328. Var_stack:
  329.     dc.l    0
  330. Var_cpuregs:
  331.     blk.l    16,0
  332.  
  333. Var_nodispregs:
  334.     dc.w    0    ; intreq
  335.     dc.w    0    ; intena
  336.     dc.w    0    ; dmacon
  337.     dc.w    0    ; adkcon
  338.  
  339. Var_led:
  340.     dc.w    0    ; LED/ audio filter
  341.  
  342. end_snapshot:
  343.     dc.l    0    ; safety
  344.